Date		:	10 d�cembre 1993
		Programme	:	VGACOPY V5.2 FRANCAIS
		Protection	:       MESSAGES de SHAREWARE
		Outils		:	SOFT-ICE V2.50
		Temps pass�	:	20 minutes
		Fichier		:       VGACOPY.EXE
		Soci�t�		:	SHAREWARE
		Divers		:	Compact� par PKLITE version PRO et le
					HEADER a �t� "scrambled".
		Origine		:	L.F.
		Num�ro		:	233


	Ici la prouesse n'�tait pas de diminuer le comptage du
	" SHAREWARE COUNTER " ni de modifier les diff�rents messages
	apparaissant � l'�cran mais plutot de d�compresser le fichier.
	L'auteur doit se m�fier des hackers car il a utilis� plusieurs types
	de compresseurs tout au long de ses versions: LZEXE, PKLITE 1.13, TZ
	etc... avec quelques fois des modifications des headers afin de 
	d�jouer les d�compresseurs du commerce: DISLITE, PKUNLITE, et mon
	PKFRED. Le seul qui s'en sort avec prouesse c'est le d�compresseur
	UNP V3.10 qui est assez ph�nom�nal. Pour un peu je lui payerais sa
	license. Mais comme elle est tellement faible ( 5$ ) l'auteur pr�f�re
	du matoss. Pourquoi pas ? Je dois bien poss�der une vieille cafeti�re
	�lectronique � pompage mol�culaire.

	Revenons-en � VGACOPY V5.2:
	Ce programme excellent en VGA et SOUNDBLASTER devient p�nible avec
	sa tempo et son message de sortie vers le DOS.
	En visualisant le header on trouve que le fichier a �t� comprim� par
	PKLITE. J'utilise donc UNP qui trouve que le fichier... n'est pas
	comprim� !
	Je me bas pendant plus de trois heures avec SOFT-ICE, UNP, PKFRED pour
	essayer de forcer la d�compression. NADA ! J'en conclu que le HEADER
	de VGACOPY a �t� volontairement modifi� pour tromper UNP. "Ils" l'ont
	bien fait avec VGA_READ.EXE ou les lettres LZ91 avaient �t� remplac�
	par autre chose.

	En lan�ant le programme avec LDR de SOFT-ICE ce dernier se plante !
	Bravo. Un coup de plus.
	
	Mais en appellant SOFT-ICE normalement, une fois que le programme est
	d�comprim� en m�moire il fonctionne. Heureusement.

	La tempo est appell�e par la routine ci-dessous:

	CS=0EFF
	CS:50BD E85CBD	CALL
	CS:50C0	E825CD	CALL	; TEMPO !
	CS:50C3 E8B4B2	CALL

	Il suffit d'y placer un JMP 50C3 autrement dit en ASM: EB01.
	Pourquoi pas trois NOP ? Parceque cel� me ferait trois instructions au
	lieu de deux avec le JMP. Et comme c'est plus facile de transferer un
	mot qu'un mot et un byte dans mon lanceur...

	Le message de fin est affich� par un CALLF appell� pour chaque ligne
	a afficher. On peut bien sur placer un RETF � la premi�re instruction
	du CALLF mais cel� ne me plait pas car il reste le cadre de l'affichage.
	En pla�ant un JMP par dessus tous ces CALLF cel� � l'air de fonctionner.

	CS=1591
	CS:05B2 CALLF ; AFFICHE UNE LIGNE DU TEXTE SHAREWARE A CHAQUE APPEL.
	
	Le jump pardessus les CALLF doit se situer en CS:05B7 ou 05B8:

	CS:05B7		PUSH CS
	CS:05B8 E851	CALL		; affiche le cadre pour le texte.

	J'ai essay� les deux positions apparement sans PB ( malgr� le push
	suppl�mentaire ). Il faut donc placer en CS:05B8 un JUMP 07D3 qui
	prend trois octets. La je n'y coupe pas: E91802.
	Donc en CS:05B8 il faut remplacer E851 par E918 et remplacer le byte
	en 05BA par 02.

	Comme le programnme est ind�comprimable ( pour l'instant, car si j'offre
	un CRAY ONE � l'auteur de UNP, je pense qu'il m'arrangera �a ) je cr�e
	mon d�tourneur d'INT avec une double boucle vue que les deux
	modifications � effectuer ne se trouve pas dans le m�me segment CS.

	Je viens malgr� tout de trouver encore une nouvelle protection anti-
	modification du fichier VGACOPY.EXE: Lors du formattage de disquette
	sans copier, le programme quitte avec un petit message sournois !
	A voir donc... control de CRC probablement.
	Nota: Le formattage d'une disquette lors d'une copie normale fonctionne.

	Voici le lanceur:
;       PATCH POUR LE PROGRAMME VGACOPY V5.2 FRANCAIS.
;	INT 10h. Pas de sous-fonction.
;******************************************************************************
;                             ZONE A INITIALISER

adr_ip1         equ     50c0h   ; Adresse dont le contenu est � modifier.
adr_ip2		equ     5b8h    ; Seconde adresse.
anc_val         equ     25e8h   ; Valeur d'origine � rechercher, invers�e.				
anc_val1        equ     51e8h   ; Seconde valeur.
nouv_val        equ     01ebh   ; Nouvelle valeur (la modif).
nouv_val1       equ     18e9h   ; Nouvelle seconde valeur.
;sous_f		equ	3eh	; Sous-fonction 3E.
INT_DET         equ     10h     ; Le num�ro de l'INT que l'on veut utiliser.
BEEP_TONE       equ     440     ; Fr�quence de la note.
nb		equ	30	; Nombre de d�pilage.

;---------------------------- int d�tourn�e --------------------------------

int_entry       proc    far
_int:           jmp     apres
_SAUVE_SP	dw      0,0
flag1           db      0
flag2           db      0 
apres:	        push    ax
		push    ds
		push    bx
		push    cx
		push    dx
		pushf                           ; Push flags
ifdef sous_f 
		cmp 	ah,sous_f
		jnz sort
endif
		mov     word ptr cs:[_SAUVE_SP],sp
		mov     cx,nb
prochain:       pop     ds
		dec     cx
		jnz     suit
		jmp     s                      
suit:		cmp     byte ptr cs:[flag1],1
		jz      patch2
		cmp     word ptr ds:[adr_ip1],anc_val   ; Si ok on patche.
		jnz     patch2
		mov     word ptr ds:[adr_ip1],nouv_val  ; On y place le patch.
		mov     byte ptr cs:[flag1],1		; Premier patch ok.
		cmp     byte ptr cs:[flag2],1		; Si second ok aussi 
		jz      tout_bon 			; on quitte avec 3 bips

patch2:		cmp     byte ptr cs:[flag2],1
		jz      prochain
		cmp     word ptr ds:[adr_ip2],anc_val1
		jnz     prochain

		mov     word ptr ds:[adr_ip2],nouv_val1
		mov     byte ptr ds:[adr_ip2+2],02	; Donn�e supl�mentaire.
		mov     byte ptr cs:[flag2],1		; Second patch ok.
		cmp     byte ptr cs:[flag1],1
		jnz     prochain

tout_bon:	xor     bx,bx